package com.lk.oauth2.sso.config;

import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;

/** @author Aspirin */
@EnableOAuth2Sso
@Configuration
public class SsoSecurityConfig extends WebSecurityConfigurerAdapter {

  /**
   * 使用了 @EnableOAuth2Sso 注解，SpringBoot 会在请求上下文中添加一个 OAuth2ClientContext 对象，而我们只要在配置类中向容器中添加 一个
   * OAuth2RestTemplate 对象，请求的资源服务器时就会把令牌带上转发过去。
   *
   * @param factory
   * @return
   */
  @Bean
  public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
    return factory.getUserInfoRestTemplate();
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        // 首页所有人都可以访问
        .antMatchers("/")
        .permitAll()
        // 其他要认证后才可以访问，如 /member
        .anyRequest()
        .authenticated()
        .and()
        .logout()
        // 当前应用退出后，会交给某个处理
        // 请求认证服务器将用户进行退出
        .logoutSuccessUrl("http://localhost:7001/auth/logout")
        .and()
        .csrf()
        .disable();
  }
}
